--block code

freeslot("MT_S2GBLOCK","MT_S2GSPIKE")

mobjinfo[MT_S2GBLOCK] = {
	doomednum = 3092,
	spawnhealth = 999999,
	spawnstate = S_PLAY_STND,
	radius = 32*FRACUNIT,
	height = 64*FRACUNIT,
	flags = MF_NOGRAVITY|MF_SOLID
}

mobjinfo[MT_S2GSPIKE] = {
	doomednum = 3093,
	spawnhealth = 999999,
	spawnstate = S_SPIKE1,
	radius = 8*FRACUNIT,
	height = 32*FRACUNIT,
	flags = MF_NOGRAVITY|MF_SOLID|MF_PAIN
}

--block code

addHook("MobjCollide", function(m,p)
	if not mapheaderinfo[gamemap].s2gg then return end
	if p.player and p.valid and P_PlayerCanDamage(p.player,m)
	and p.z < m.z+m.height*12/10 and p.z+p.height > m.z-m.height/4 then
		local debris
		for i=1,4 do
			debris = P_SpawnMobjFromMobj(m,8*FRACUNIT*i-16*FRACUNIT,0,16*FRACUNIT*i,MT_ROCKCRUMBLE1)
			debris.angle = ANGLE_180*(i%2)
			P_InstaThrust(debris,debris.angle,3*FRACUNIT)
			P_SetObjectMomZ(debris,3*FRACUNIT)
			debris.flags = MF_NOCLIPTHING|MF_NOCLIP|MF_NOCLIPHEIGHT
			debris.fuse = 3*TICRATE
		end
		if P_MobjFlip(p)*p.momz < -8*p.scale then
			p.momz = $*-1
		end
		S_StartSound(p,sfx_s2gbrk)
		P_KillMobj(m)
	end
end,MT_S2GBLOCK)

--spring code

addHook("MobjCollide", function(m,p)
	if not mapheaderinfo[gamemap].s2gg then return end
	if p.player and p.valid and p.momz >= 0 
	and not (p.eflags & MFE_JUSTHITFLOOR) then
		return false
	end
end,MT_REDSPRING)

--spike code

addHook("MobjThinker", function(m)
	if not mapheaderinfo[gamemap].s2gg then return end
	m.s2g_sprite = "SPIK1"
		
	for p in players.iterate do
		if R_PointToDist2(m.x,m.y,p.mo.x,p.mo.y) < 90*FRACUNIT
		and p.mo.z >= m.floorz and p.mo.z <= m.ceilingz
		and not m.timetofall then
			m.timetofall = 1
		end
	end
	
	if m.timetofall then
		m.timetofall = $+1
		
		if m.timetofall < 6 then
			m.s2g_sprite = "SPIK"..tostring((m.timetofall%2)+1)
		else
			m.flags = $ & ~MF_NOGRAVITY
			m.momz = $ + P_GetMobjGravity(m)*2/3
		end
	end
	
	if m.usesprite then
		m.s2g_sprite = "SPIK"..tostring(m.usesprite+2)
	end
	
	if P_IsObjectOnGround(m) and not m.usesprite then
		local bs
		for i=1,2 do
			bs = P_SpawnMobjFromMobj(m,10*FRACUNIT-(i*FRACUNIT*5),0,(i*FRACUNIT*20)-20*FRACUNIT,MT_S2GSPIKE)
			bs.usesprite = i
			bs.flags = MF_NOCLIPTHING|MF_NOCLIP|MF_NOCLIPHEIGHT
			bs.fuse = 3*TICRATE
			P_InstaThrust(bs,ANGLE_180*(i-1),1*FRACUNIT)
			P_SetObjectMomZ(bs,10*FRACUNIT)
		end
		P_KillMobj(m)
	end
	
end, MT_S2GSPIKE)

--crab
addHook("MobjThinker", function(m)
	if not mapheaderinfo[gamemap].s2gg then return end
	if m.health == 0 then
		m.s2g_sprite = "BOOM"..tostring(m.frame/2+1)
	else
		m.s2g_sprite = "CRAB"..tostring((leveltime%8)/4+1)
		m.state = S_PLAY_STND
	
		if not m.movement then
			m.movement = 0
			m.movefactor = 1
		end
		
		if leveltime%350 == 0 then
			m.attacktimer = 70
		else
			if m.attacktimer then
				m.s2g_sprite = "CRAB3"
				m.attacktimer = $-1
				m.momx = 0
				if m.attacktimer == 35 then
					local bs
					for i=1,2 do
						bs = P_SpawnMobjFromMobj(m,0,0,16*FU,MT_JETTBULLET)
						bs.flags = $ & ~MF_NOGRAVITY
						bs.target = m
						P_SetObjectMomZ(bs, 10*FRACUNIT)
						P_InstaThrust(bs, ANGLE_180*i,2*FRACUNIT)
					end
				end
			else
				if abs(m.movement) == 60 then
					m.movement = $-$/60
					m.movefactor = $*-1
				else
					m.movement = max(-60,min(60,$+m.movefactor))
					m.momx = m.movefactor*3*FRACUNIT
				end
			end
		end
	end
	
end, MT_BLUECRAWLA)

--sprites for objects

addHook("MobjThinker", function(m)
	if not mapheaderinfo[gamemap].s2gg then return end
	m.s2g_sprite = "LAVA"..tostring((leveltime%15)/5+1)
end, MT_GFZFLOWER1)

addHook("MobjThinker", function(m)
	if not mapheaderinfo[gamemap].s2gg then return end
	m.s2g_sprite = "BLOCK"
end, MT_S2GBLOCK)

addHook("MobjThinker", function(m)
	if not mapheaderinfo[gamemap].s2gg then return end
	m.s2g_sprite = "DEBRI"
end, MT_ROCKCRUMBLE1)

addHook("MobjThinker", function(m)
	if not mapheaderinfo[gamemap].s2gg then return end
	m.s2g_sprite = "BULT"..tostring((leveltime%4)/2+1)
	if m.state == S_XPLD1 then
		m.state = S_NULL
	end
end, MT_JETTBULLET)

addHook("MobjThinker", function(m)
	if not mapheaderinfo[gamemap].s2gg then return end
	if m.state == S_RING then
		m.s2g_sprite = "RING"..tostring((leveltime%24)/4+1)
	else
		m.s2g_sprite = "SPRK"..tostring((leveltime%16)/4+1)
	end
end, MT_RING)

addHook("MobjThinker", function(m)
	if not mapheaderinfo[gamemap].s2gg then return end
	if m.flags2 & MF2_DONTDRAW then
		m.s2g_sprite = nil
	else
		if m.state == S_RING then
			m.s2g_sprite = "FRNG"..tostring((leveltime%16)/4+1)
		else
			m.s2g_sprite = "SPRK"..tostring((leveltime%16)/4+1)
		end
	end
end, MT_FLINGRING)

addHook("MobjThinker", function(m)
	if not mapheaderinfo[gamemap].s2gg then return end
	m.s2g_sprite = "BOOM"..tostring(m.frame/2+1)
end, MT_EXPLODE)

--monitors
addHook("MobjThinker", function(m)
	if not mapheaderinfo[gamemap].s2gg then return end
	m.color = displayplayer.mo.color
	if m.health then
		if leveltime%6 < 2 then
			m.s2g_sprite = "MNTR1"
		else
			m.s2g_sprite = "MNTR3"
		end
	else
		m.s2g_sprite = nil
	end
end, MT_1UP_BOX)

addHook("MobjThinker", function(m)
	if not mapheaderinfo[gamemap].s2gg then return end
	if m.health then
		if leveltime%6 < 2 then
			m.s2g_sprite = "MNTR1"
		else
			m.s2g_sprite = "MNTR5"
		end
	else
		m.s2g_sprite = nil
	end
end, MT_INVULN_BOX)

addHook("MobjThinker", function(m)
	if not mapheaderinfo[gamemap].s2gg then return end
	if m.health then
		if leveltime%6 < 2 then
			m.s2g_sprite = "MNTR1"
		else
			m.s2g_sprite = "MNTR4"
		end
	else
		m.s2g_sprite = nil
	end
end, MT_SNEAKERS_BOX)

addHook("MobjThinker", function(m)
	if not mapheaderinfo[gamemap].s2gg then return end
	if m.health then
		if leveltime%6 < 2 then
			m.s2g_sprite = "MNTR1"
		else
			m.s2g_sprite = "MNTR2"
		end
	else
		m.s2g_sprite = nil
	end
end, MT_RING_BOX)

addHook("MobjThinker", function(m)
	if not mapheaderinfo[gamemap].s2gg then return end
	if S_SoundPlaying(m,sfx_lvpass) then
		S_StopSoundByID(m,sfx_lvpass)
		S_StartSound(m,sfx_s2ggps)
	end
	if not P_IsObjectOnGround(m) then
		m.s2g_sprite = "SIGN"..tostring((leveltime%4)+1)
		if not m.signchance then
			m.signchance = P_RandomRange(1,4)
			m.signtimer = 10
		end
	else
		if m.signchance then
			m.s2g_sprite = "SIGN"..tostring(4+m.signchance)
			if S_SoundPlaying(m,sfx_s2ggps)
				S_StopSoundByID(m,sfx_s2ggps)
				S_StartSound(m,sfx_s2ggpl)
			end
		else
			m.s2g_sprite = "SIGN1"
		end
		if m.signtimer then
			m.signtimer = $-1
			if m.signtimer == 1 then
				for p in players.iterate do
					if p.mo and p.mo.valid then
						if m.signchance == 1 then
							P_GivePlayerLives(p,1)
							P_PlayLivesJingle(p)
						elseif m.signchance == 2 then
							S_StartSound(m,sfx_s2ghit)
						elseif m.signchance == 3 then
							P_GivePlayerLives(p,1)
							P_PlayLivesJingle(p)
						else
							P_GivePlayerRings(p,10)
							S_StartSound(m,sfx_s2grng)
						end
					end
				end
			end
		end
	end
end, MT_SIGN)